package com.shop.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.shop.mapper.Pms_Attr_Mapper;
import com.shop.mapper.Pms_Category_Attr_Mapper;
import com.shop.pojo.pms.Pms_Attr;
import com.shop.pojo.pms.Pms_Category_Attr;
import com.shop.service.Pms_Category_Attr_Service;
import com.shop.utils.LayuiUtils;
import com.shop.utils.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

@Service
public class Pms_Category_Attr_ServiceImpl implements Pms_Category_Attr_Service {
@Autowired
private Pms_Category_Attr_Mapper pms_category_attr_mapper;
@Autowired
private Pms_Attr_Mapper pms_attr_mapper;
    /*
     * @Description 多条件分页查询属性分类信息、可以根据属性名字来进行查询
     * @param page
     * @param attrName
     * @return com.shop.utils.LayuiUtils<com.shop.pojo.pms.Pms_Category_Attr>
     * @author liusupeng
     * @date 2020/11/1 21:59
     */
    @Override
    public LayuiUtils<Pms_Category_Attr> PMS_ATTR_LAYUI_UTILS(Integer page, String attrName) {

        LayuiUtils<Pms_Category_Attr> layuiUtils=new LayuiUtils<>();
        Page<Pms_Category_Attr> pms_attrPage=new Page<>(page,10);
        QueryWrapper<Pms_Attr> queryWrapper=new QueryWrapper();
        QueryWrapper<Pms_Category_Attr> pms_category_attrQueryWrapper=new QueryWrapper<Pms_Category_Attr>();
        if(attrName!=null&&attrName!=""){
            queryWrapper.eq("attr_name",attrName);
            List<Pms_Attr> pms_attrs = pms_attr_mapper.selectList(queryWrapper);
            List<Long> listId = pms_attrs.stream().map((x) -> {
                return x.getAttr_id();
            }).collect(Collectors.toList());
            System.out.println("list:"+listId);
            pms_category_attrQueryWrapper.in("pca.attr_id",listId);
        }
        pms_category_attrQueryWrapper.orderByAsc("pca.attr_id");
        Page<Pms_Category_Attr> pms_attrPage1= pms_category_attr_mapper.findAttrByCategory(pms_attrPage,pms_category_attrQueryWrapper);
        layuiUtils.setCount(pms_attrPage1.getTotal());
        layuiUtils.setData(pms_attrPage1.getRecords());
        return layuiUtils;
    }

    @Override
    public R findAllPms_Category_Attr(Pms_Category_Attr pms_category_attr) {
        QueryWrapper<Pms_Category_Attr> queryWrapper=new QueryWrapper<>();
        queryWrapper.eq("pca.cat_id",pms_category_attr.getCat_id());
        List<Pms_Category_Attr> attrByCategoryList = pms_category_attr_mapper.findAttrByCategoryList(queryWrapper);
        R r1=new R();
        r1.data(attrByCategoryList);
        return r1;
    }

    /*
     * @Description
     * 修改一条属性分类中间表信息，
     * 主要修改禁用状态和是否用于搜索
     * 如果传入了属性名的话，那么就修改下属性表里的名字
     * 如果成功则根据属性名去属性表里查找他的全部id
     * 通过stream流把id都重新封装成一个集合id
     * 拿到这个属性的全部id去属性分类中间表进行查询
     * 拿到这个id在中间表里的全部数据
     * 通过循环进行比较，这里面的数据里的分类和传来的分类id是否相同，如果相同的话，
     * 就代表着前台传来的属性id和分类id已经存在了，则抛出一个异常让事务回滚
     * @param pms_attr
     * @return com.shop.utils.R
     * @author liusupeng
     * @date 2020/10/29 19:28
     */
    @Transactional(rollbackFor = NullPointerException.class)
    @Override
    public R putPms_Attr_category(Pms_Category_Attr pms_attr) {



            if(pms_attr.getAttr_name()!=null){

                //说明要修改属性名字
                  Pms_Attr pms_attr1=new Pms_Attr();
                pms_attr1.setAttr_id(pms_attr.getAttr_id());
                pms_attr1.setAttr_name(pms_attr.getAttr_name());
               pms_attr_mapper.updateById(pms_attr1);
                int put = pms_category_attr_mapper.updateById(pms_attr);
                if(put>0){
                    QueryWrapper<Pms_Attr> queryWrappeattrr=new QueryWrapper();
                    queryWrappeattrr.eq("attr_name",pms_attr.getAttr_name());
                    QueryWrapper<Pms_Category_Attr> queryWrapperPms_Category_Attr=new QueryWrapper<>();

                    List<Pms_Attr> pms_attrs = pms_attr_mapper.selectList(queryWrappeattrr);
                    List<Long> listId = pms_attrs.stream().map((x) -> {
                        return x.getAttr_id();
                    }).collect(Collectors.toList());
                    queryWrapperPms_Category_Attr.in("attr_id",listId).eq("cat_id",pms_attr.getCat_id());
                    List<Pms_Category_Attr> pms_category_attrs = pms_category_attr_mapper.selectList(queryWrapperPms_Category_Attr);
                    if(pms_category_attrs.size()>1){
                        throw new NullPointerException();
                    }
                    return R.success();
                }
            }else{
                int put = pms_category_attr_mapper.updateById(pms_attr);
                if(put>0){
                    return R.success();
                }
            }

        return R.error(500,"服务器异常");
    }
    /*
     * @Description 首先根据属性名去属性表里查找他的全部id
     *
     * 通过stream流把id都重新封装成一个集合id（前提条件是如果有数据的话在去封装id，没有数据直接添加数据即可）
     * 拿到这个属性的全部id去属性分类中间表进行查询
     * 拿到这个id在中间表里的全部数据
     * 通过循环进行比较，这里面的数据里的分类和传来的分类id是否相同，如果相同的话，
     * 就代表着前台传来的属性id和分类id已经存在了，则抛出一个异常
     * 如果不相同的话则开始添加两条数据
     * 首先去属性表里添加、然后在去属性分类表里添加
     * @param pms_attr
     * @return void
     * @author liusupeng
     * @date 2020/11/1 23:13
     */
@Transactional()
    @Override
    public void addPms_Attr_category(Pms_Category_Attr pms_attr) {

    QueryWrapper<Pms_Attr> queryWrappeattrr=new QueryWrapper();
    queryWrappeattrr.eq("attr_name",pms_attr.getAttr_name());
      QueryWrapper<Pms_Category_Attr> queryWrapperPms_Category_Attr=new QueryWrapper<>();

    List<Pms_Attr> pms_attrs = pms_attr_mapper.selectList(queryWrappeattrr);
    if (pms_attrs.size()>0){
        List<Long> listId = pms_attrs.stream().map((x) -> {
            return x.getAttr_id();
        }).collect(Collectors.toList());
        queryWrapperPms_Category_Attr.in("attr_id",listId);
        List<Pms_Category_Attr> pms_category_attrs = pms_category_attr_mapper.selectList(queryWrapperPms_Category_Attr);
        pms_category_attrs.forEach(x->{
            if(x.getCat_id()==pms_attr.getCat_id()){
                throw new NullPointerException();
            }
        });
    }


    Pms_Attr pa=new Pms_Attr();
            pa.setAttr_name(pms_attr.getAttr_name());
            pms_attr_mapper.insert(pa);
            pms_attr.setAttr_id(pa.getAttr_id());
            pms_category_attr_mapper.insert(pms_attr);
    }
}
